// request 是 demo 项目脚手架中提供的一个做 http 请求的方法，是对于 fetch 的封装，返回 Promise
import request from '../util/request';
import { message } from 'antd'

const delay = (millisecond) => {
    return new Promise((resolve) => {
        setTimeout(resolve, millisecond);
    })
}
// dva model用法: namespace作为model的唯一标识，state中就是该model管理的数据
export default {
    namespace: 'puzzlecards',
    state: {
        data:[],
        counter: 0
    },
    effects: { // 处理异步操作
        *queryInitCards(_, sagaEffects) {
            const { call, put } = sagaEffects;
            const endPointURI = 'https://official-joke-api.appspot.com/random_joke';
            try{
                const puzzle = yield call(request, endPointURI); // 获取服务端数据
                yield put({ type: 'addNewCard', payload: puzzle }); // 添加一个卡片数据，这个会触发reducer的执行
                yield call(delay, 3000); // 暂停3秒

                const puzzle2 = yield call(request, endPointURI); // 第二次获取服务端数据
                yield put({ type: 'addNewCard', payload: puzzle2 }); // 再添加一个卡片数据
            } catch(e) {
                message.error('数据获取失败！'); // 打印错误信息
            }
        }
    },
    reducers: { // 用于响应action并修改state reducers描述如何改变数据
        addNewCard(state, { payload: newCard }) {
            const nextCounter = state.counter + 1;
            const newCardWithId = { ...newCard, id: nextCounter };
            const nextData = state.data.concat(newCardWithId);
            return {
                data: nextData,
                counter: nextCounter
            }
        }
    }
}